#include <iostream>
#include <cstring>

// 定义MAC地址长度
#define MAC_ADDRESS_LENGTH 6

// 定义MAC地址类型
typedef unsigned char MAC_address[MAC_ADDRESS_LENGTH];

// 定义以太网帧结构体
typedef struct {
    MAC_address destMac;
    MAC_address srcMac;
    // 其他字段省略
} EthernetFrame;

// 定义本机地址
MAC_address this_mac_address = {0x00, 0x50, 0x56, 0xc0, 0x00, 0x01};

// 判断是否本机地址、多播或广播地址
int mac_address_match(const EthernetFrame *frame) {
    // 判断是否为本机地址
    if (memcmp(frame->destMac, this_mac_address, MAC_ADDRESS_LENGTH) == 0) {
        return 1;
    }
    // 判断是否为广播地址
    int isBroadcast = 1;
    for (int i = 0; i < MAC_ADDRESS_LENGTH; ++i) {
        if (frame->destMac[i] != 0xff) {
            isBroadcast = 0;
            break;
        }
    }
    if (isBroadcast) {
        return 1;
    }
    // 判断是否为多播地址（多播位为1，即第一个字节的最高位为1）
    if (frame->destMac[0] & 0x01) {
        return 1;
    }
    return 0;
}

int main() {
    system("chcp 65001");
    
    EthernetFrame testFrame;
    // 假设设置一个测试帧的目的地址为广播地址
    for (int i = 0; i < MAC_ADDRESS_LENGTH; ++i) {
        testFrame.destMac[i] = 0xff;
    }
    if (mac_address_match(&testFrame)) {
        std::cout << "该帧应该被接收" << std::endl;
    } else {
        std::cout << "该帧不应该被接收" << std::endl;
    }
    return 0;
}